知识点名称:Activity的生命周期

编号: K3-4

前驱知识点编号:K3-3

作者:

讲义内容:

Activity从一种状态转变到另一种状态时会触发一些事件,执行一些回调方法来通知状态的变化,这些方法也被称为它的七大生命周期函数。具体方法如下所示:

• void onCreate(Bundle savedInstanceState):创建时执行

• void onStart():可见时执行

• void onRestart():回到前台,再次可见时执行

• void onResume():获取焦点时执行

• void onPause():失去焦点时执行

• void onStop():用户不可见进入后台时执行

• void onDestroy():销毁时执行

下图说明了 Activity 在不同状态间转换的时机和条件,以及不同状态下执行的回调函数。

下面我们结合Activity的生命周期图以及Activity的基本状态,来分析每个方法的调用时机:

(1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

(2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

(3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

(4)当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

(5)用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

(6)当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

(7)用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

下面我们就结合实例,来演示一下生命周期的几个过程的详细情况。我们新建一个名为lifecycle的项目,创建一个名为LifeCycleActivity和TargetActivity的Activity,其中LifeCycleActivity作为主界面,主界面上有一个按钮,点击按钮可以跳转到TargetActivity界面,并对这两个Activity进行如下的注册。

<activity
     android:name=".LifeCycleActivity"
         android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <catego
android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".TargetActivity"></activity>

下面我们先来看LifeCycleActivity中的代码:

Activity创建时被调用的onCreate方法代码如下:

public class LifeCycleActivity extends Activity {
    private static final String TAG = "LifeCycleActivity";  
    private Context context = this;  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        Log.i(TAG, "onCreate called.");  
        setContentView(R.layout.lifecycle);  
        Button btn = (Button) findViewById(R.id.btn);  
        btn.setOnClickListener(new OnClickListener() {  
        public void onClick(View v) {
            Intent intent = new Intent(context, TargetActivity.class);  
            startActivity(intent);
                }  
            });  
    }  
}

Activity创建或者从后台重新回到前台时被调用的onStart方法代码重写如下:

protected void onStart() {  
        super.onStart();  
        Log.i(TAG, "onStart called.");  
    }

Activity从后台重新回到前台时被调用的onRestart方法代码重写如下:

protected void onRestart() {  
        super.onRestart();  
        Log.i(TAG, "onRestart called.");  
    }

Activity创建或者从被覆盖、后台重新回到前台时被调用的onResume方法代码重写如下:

protected void onResume() {  
        super.onResume();  
        Log.i(TAG, "onResume called.");  
    }

Activity被覆盖到下面或者锁屏时被调用的onPause方法代码重写如下:

protected void onPause() {  
        super.onPause();  
        Log.i(TAG, "onPause called.");  
        //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据  
    }

退出当前Activity或者跳转到新Activity时被调用的onStop方法代码重写如下:

 protected void onStop() {  
        super.onStop();  
        Log.i(TAG, "onStop called.");     
    }

退出当前Activity时被调用,调用之后Activity就结束了的onDestroy方法代码重写如下:

protected void onDestroy() {  
        super.onDestroy();  
        Log.i(TAG, "onDestory called.");  
    }

下面我们就来操作一下这个Activity,看看它的生命周期到底是个什么样的过程:

(1)启动Activity:

在系统调用了onCreate和onStart之后,调用了onResume,自此,Activity进入了运行状态,运行结果截图如下:

(2)跳转到其他Activity,或按下Home键回到主屏:

我们看到,主界面退居后台时,onPause后onStop相继被调用,运行结果截图如下:

(3)从后台回到前台:

当从后台会到前台时,系统先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,Activity又进入了运行状态,运行结果截图如下:

(4)退出

最后onDestory方法被调用,标志着LifeCycleActivity的终结,运行结果截图如下:

以上实例我们演示了Activity生命周期的过程,以及该过程中代表它生命周期的七个函数的回调机制。

<!--

/* Font Definitions */

@font-face

{font-family:Helvetica;

panose-1:2 11 5 4 2 2 2 2 2 4;

mso-font-charset:0;

mso-generic-font-family:swiss;

mso-font-format:other;

mso-font-pitch:variable;

mso-font-signature:3 0 0 0 1 0;}

@font-face

{font-family:宋体;

panose-1:2 1 6 0 3 1 1 1 1 1;

mso-font-alt:SimSun;

mso-font-charset:134;

mso-generic-font-family:auto;

mso-font-pitch:variable;

mso-font-signature:3 680460288 22 0 262145 0;}

@font-face

{font-family:"Cambria Math";

panose-1:2 4 5 3 5 4 6 3 2 4;

mso-font-charset:0;

mso-generic-font-family:roman;

mso-font-pitch:variable;

mso-font-signature:-536870145 1107305727 0 0 415 0;}

@font-face

{font-family:"\@宋体";

panose-1:2 1 6 0 3 1 1 1 1 1;

mso-font-charset:134;

mso-generic-font-family:auto;

mso-font-pitch:variable;

mso-font-signature:3 680460288 22 0 262145 0;}

/* Style Definitions */

p.MsoNormal, li.MsoNormal, div.MsoNormal

{mso-style-unhide:no;

mso-style-qformat:yes;

mso-style-parent:"";

margin:0cm;

margin-bottom:.0001pt;

text-align:justify;

text-justify:inter-ideograph;

mso-pagination:none;

font-size:10.5pt;

mso-bidi-font-size:12.0pt;

font-family:"Times New Roman","serif";

mso-fareast-font-family:宋体;

mso-font-kerning:1.0pt;}

.MsoChpDefault

{mso-style-type:export-only;

mso-default-props:yes;

font-size:10.0pt;

mso-ansi-font-size:10.0pt;

mso-bidi-font-size:10.0pt;

mso-ascii-font-family:"Times New Roman";

mso-fareast-font-family:宋体;

mso-hansi-font-family:"Times New Roman";

mso-font-kerning:0pt;}

/* Page Definitions */

@page

{mso-page-border-surround-header:no;

mso-page-border-surround-footer:no;}

@page WordSection1

{size:612.0pt 792.0pt;

margin:72.0pt 90.0pt 72.0pt 90.0pt;

mso-header-margin:36.0pt;

mso-footer-margin:36.0pt;

mso-paper-source:0;}

div.WordSection1

{page:WordSection1;}

-->

下面我们再来看各Activity之间是如何协调的,当一个Activity启动另一个Activity时,它们都会体验到生命周期转变。第一个Activity暂停并停止(但如果它在后台仍然可见,则不会停止)时,同时系统会创建另一个Activity。如果这些Activity共用保存到磁盘或其他地方的数据,必须了解的是,在创建第二个Activity前,第一个Activity不会完全停止。更确切地说,启动第二个Activity的过程与停止第一个Activity的过程存在重叠。

生命周期回调的顺序经过明确定义后,当两个Activity位于同一进程,并且由一个Activity启动另一个Activity时,其定义尤其明确。以下是当Activity A启动Activity B时一系列操作的发生顺序:

1.Activity A的onPause()方法执行。

2.Activity B的onCreate()onStart()onResume()方法依次执行。(Activity B现在具有用户焦点。)

3.然后,如果Activity A在屏幕上不再可见,则其onStop()方法执行。

请你利用这种可预测的生命周期回调顺序管理从一个Activity到另一个Activity的信息转变。例如,如果你必须在第一个Activity停止时向数据库写入数据,以便下一个Activity能够读取该数据,则应在onPause()而不是onStop()执行期间向数据库写入数据。

lo.,�̛

results matching ""

    No results matching ""